// XortDebugEngine.cpp : Implementation of DLL Exports.


#include "stdafx.h"
#include "xort.h"
#include "xruntime.h"
#include "DebugProperty.h"
#include "DebugStack.h"
#include "dllmain.h"
#include "Program.h"
#include "Engine.h"

#ifdef _USRDLL

// Used to determine whether the DLL can be unloaded by OLE.
STDAPI DllCanUnloadNow(void)
{
    return _AtlModule.DllCanUnloadNow();
}

// Returns a class factory to create an object of the requested type.
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}

// DllRegisterServer - Adds entries to the system registry.
STDAPI DllRegisterServer(void)
{
    SetMetric( metrictypeEngine, __uuidof(Engine), metricName, L"XortDebugEngine", false, strRegistrationRoot ); 
    SetMetric( metrictypeEngine, __uuidof(Engine), metricCLSID, CLSID_Engine, false, strRegistrationRoot ); 
    SetMetric( metrictypeEngine, __uuidof(Engine), metricProgramProvider, CLSID_MsProgramProvider, false, strRegistrationRoot );

    // registers object, typelib and all interfaces in typelib
    HRESULT hr = _AtlModule.DllRegisterServer();
    return hr;
}

// DllUnregisterServer - Removes entries from the system registry.
STDAPI DllUnregisterServer(void)
{
    RemoveMetric( metrictypeEngine, __uuidof(Engine), metricName, strRegistrationRoot ); 
    RemoveMetric( metrictypeEngine, __uuidof(Engine), metricCLSID, strRegistrationRoot ); 
    RemoveMetric( metrictypeEngine, __uuidof(Engine), metricProgramProvider, strRegistrationRoot ); 

    HRESULT hr = _AtlModule.DllUnregisterServer();
    return hr;
}

// DllInstall - Adds/Removes entries to the system registry per user per machine.
STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine)
{
    HRESULT hr = E_FAIL;
    static const wchar_t szUserSwitch[] = L"user";

    if (pszCmdLine != NULL)
    {
        if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
        {
            ATL::AtlSetPerUserRegistration(true);
        }
    }

    if (bInstall)
    {	
        hr = DllRegisterServer();
        if (FAILED(hr))
        {
            DllUnregisterServer();
        }
    }
    else
    {
        hr = DllUnregisterServer();
    }

    return hr;
}

#endif
